To reach as wide a market as possible, software products are often designed so that their user interface can be provided in many different languages. An end user who uses the software product can specify their preferred language. When the software product executes, it identifies the preferred language (e.g., from a configuration store) and provides the user interface in that language if that language is supported by the software product. To support multiple languages, a software product may include a core package that implements the core functionality of the product and a language package for each of the supported languages. A language package contains the user interface elements for a particular language. These user interface elements are referred to as resources, and each resource has a resource identifier. When the core package executes, it retrieves the user interface elements from the language package of the preferred language.
When a software product is initially installed on a computing device, the core package and many different language packages may be installed. In such a case, the core package is likely to be fully compatible with the language packages. However, after initial installation, the core package and the language packages may be updated independently, which may result in an incompatibility between the core package and the language packages. For example, a service package may be provided to update the core package, and other service packages may be provided to update the language packages. The update to the core package may provide a new user interface element, and the updates to the language packages may provide that user interface element in the appropriate languages. If a user applies the service package for the core package, but not the service packages for the language packages, then the core package will not be able to correctly display the new user interface element. Indeed, the core package may exhibit an undesirable behavior when it attempts to retrieve that user interface element from a language package that has not been updated. This undesirable behavior may include terminating execution of the software product abnormally, overwriting of data, displaying of gibberish, and so on.